package agenda;

import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;

public class Agenda implements Serializable {

	private static final long serialVersionUID = 1L;

	private List<Contato> contatos;
	private List<Evento> eventos;

	/**
	 * Cria uma nova Agenda.
	 */

	public Agenda() {
		contatos = new ArrayList<Contato>();
		eventos = new ArrayList<Evento>();
	}

	/**
	 * Recupera a lista dos contatos armazenados na agenda.
	 * @return A lista dos contatos armazenados na agenda.
	 */

	public ArrayList<Contato> getContatos() {
		return (ArrayList<Contato>) contatos;
	}

	/**
	 * Recupera a lista de eventos cadastrados na agenda.
	 * @return A lista de eventos cadastrados na agenda.
	 */

	public ArrayList<Evento> getEventos() {
		return (ArrayList<Evento>)eventos;
	}

	/**
	 * Assumindo que a lista de contatos sempre esta ordenada, encontra a posicao em que um
	 * contato deve ser inserido de forma a manter a ordenacao.
	 * @param c Um contato,
	 * @param lista A lista de contatos na qual sera feita a busca da posicao.
	 * @return A posicao em que o contato deve ser adicionado para que a lista permaneca ordenada.
	 */

	public static int encontraPosicao(Contato c, ArrayList<Contato> lista) {

		int posicao;

		for (posicao = 0; posicao < lista.size(); posicao++) {
			if (c.compareTo(lista.get(posicao)) < 0) break;
		}

		return posicao;
	}

	/**
	 * Assumindo que a lista de eventos sempre esta ordenada, encontra a posicao em que um
	 * evento deve ser inserido de forma a manter a ordenacao.
	 * @param e Um evento.
	 * @param lista Lista na qual sera feita a busca da posicao
	 * @return A posicao em que o evento deve ser adicionado para que a lista permaneca ordenada
	 */

	public static int encontraPosicao(Evento e, ArrayList<Evento> lista) {

		int posicao;

		for (posicao = 0; posicao < lista.size(); posicao++) {
			if (e.compareTo(lista.get(posicao)) < 0) break;
		}

		return posicao;

	}

	/**
	 * Adiciona um novo contato a agenda.
	 * @param contato O contato a ser adicionado
	 */

	public void addContato(Contato contato) {
		int posicao = encontraPosicao(contato, (ArrayList<Contato>)contatos);
		contatos.add(posicao, contato);
	}

	/**
	 * Adiciona um novo evento a agenda
	 * @param ev O evento a ser adicionado
	 */

	public void addEvento(Evento ev) {
		int posicao = encontraPosicao(ev, (ArrayList<Evento>)eventos);
		eventos.add(posicao, ev);
	}

	/**
	 * Representa uma Agenda como String.
	 * @return A representacao da agenda em String.
	 */

	@Override
	public String toString() {
		// TODO CARALOH . . . deixe de ser brabo viu!
		return super.toString();
	}

}